/**
 * @file state.h
 * @brief 系统状态监控模块头文件
 *        定义各硬件模块（陀螺仪、遥控器、电机、通信等）的状态枚举及监控结构体，用于实时跟踪系统运行状态
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-08
 * 
 * @copyright Copyright (c) 2025 邱伟凡
 * 
 * @note 正常为0，不正常为非0，默认全正常
 * 
 * @par 修改日志:
 * - 2025-08-08: 初始版本创建，定义基础状态监控结构体
 * 
 * @bug 待解决问题:
 * - 还未测试遥控器状态转化是否正常
 * - 可以尝试添加sd卡，用于存储异常
 */
#ifndef STATE_H
#define STATE_H
#include <stdbool.h>
#include <stdint.h>
#include "QWF_Custom_Ctrl.h"

/**
 * @brief 强制结构体1字节对齐（用于严格内存对齐或通信协议场景）
 */
#pragma pack(push, 1)

/****************** 通用状态定义（各模块共享） ***********************/
/**
 * @brief 陀螺仪状态监控结构体
 */
typedef struct {
    enum { /* 陀螺仪状态枚举 */
        gyro_ok = 0,    /**< 陀螺仪正常（通信正常且数据有效） */
        gyro_lose = 1,  /**< 陀螺仪掉线（通信中断或数据异常） */
    } state;
    struct {
        float tick;     /**< 连续在线计时（秒，用于超时判断） */
        uint8_t yes;    /**< 在线标志（1:在线，0:离线） */
    } online;           /**< 在线状态记录 */
} gyro_state_t;

/**
 * @brief 遥控器状态监控结构体
 */
typedef struct {
    enum { /* 遥控器状态枚举 */
        rc_ok = 0,      /**< 遥控器正常（信号稳定） */
        rc_lose = 1,    /**< 遥控器掉线（信号中断） */
    } state;
    struct {
        float tick;     /**< 连续在线计时 */
        uint8_t yes;    /**< 在线标志 */
    } online;           /**< 在线状态记录 */
} rc_state_t;

/**
 * @brief 双板通信状态监控结构体
 */
typedef struct {
    enum { /* 双板通信状态枚举 */
        communicate_ok = 0,            /**< 通信正常（数据帧头及内容有效） */
        communicate_lose,              /**< 通信掉线（无数据接收） */
        communicate_head_error,        /**< 帧头错误（收到非自制协议帧头） */
    } state;
    struct {
        float tick;     /**< 连续在线计时 */
        uint8_t yes;    /**< 在线标志 */
    } online;           /**< 在线状态记录 */
    struct {
        uint8_t num;    /**< 累计帧头错误次数 */
        uint8_t time;   /**< 最近一次错误时间 */
        uint8_t yes;    /**< 未处理错误标志（1:有未处理错误） */
    } head;             /**< 帧头错误统计 */
} communicate_state_t;

/**
 * @brief GM6020电机状态监控结构体
 */
typedef struct {
    enum { /* GM6020电机状态枚举 */
        gm6020_ok = 0,           /**< 电机正常（通信正常且参数无异常） */
        gm6020_lose = 1,         /**< 电机掉线（通信中断） */
        gm6020_too_hot_1,        /**< 一级过热（温度超过阈值1） */
        gm6020_too_hot_2,        /**< 二级过热（温度超过阈值2，需停机） */
        gm6020_i_over_max,       /**< 电流超限（堵转或负载过大） */
    } state;
    struct {
        float tick;     /**< 连续在线计时 */
        uint8_t yes;    /**< 在线标志 */
    } online;           /**< 在线状态记录 */
    struct {
        float err;      /**< 当前温度误差（实际温度-阈值） */
        float tick;     /**< 异常持续时间 */
        uint8_t yes;    /**< 温度异常标志 */
    } temp;             /**< 温度异常记录 */
    struct {
        float err;      /**< 当前电流误差（实际电流-阈值） */
        float tick;     /**< 异常持续时间 */
        uint8_t yes;    /**< 电流异常标志 */
    } torque;           /**< 电流异常记录 */
} gm6020_state_t;

/**
 * @brief C620电调状态监控结构体
 */
typedef struct {
    enum { /* C620电调状态枚举 */
        c620_ok = 0,          /**< 电调正常（通信正常且参数无异常） */
        c620_lose,            /**< 电调掉线（通信中断） */
        c620_i_over_max,      /**< 电流超限（堵转或负载过大） */
    } state;
    struct {
        float tick;     /**< 连续在线计时 */
        uint8_t yes;    /**< 在线标志 */
    } online;           /**< 在线状态记录 */
    struct {
        float err;      /**< 当前电流误差（实际电流-阈值） */
        float tick;     /**< 异常持续时间 */
        uint8_t yes;    /**< 电流异常标志 */
    } torque;           /**< 电流异常记录 */
} c620_state_t;

/************** 上板专用状态（如视觉模块） *****************/

/**
 * @brief 视觉模块状态监控结构体
 */
typedef struct {
    enum { /* 视觉模块状态枚举 */
        vision_ok = 0,        /**< 视觉正常 */
        vision_lose = 1,      /**< 视觉掉线 */
    } state;
    struct {
        float tick;     /**< 连续在线计时 */
        uint8_t yes;    /**< 在线标志 */
    } online;           /**< 在线状态记录 */
} vision_state_t;

/*************** 下板专用状态（如裁判系统、超电） ******************/

/**
 * @brief 裁判系统状态监控结构体
 */
typedef struct {
    enum { /* 裁判系统状态枚举 */
        judge_ok = 0,         /**< 裁判系统正常（数据接收有效） */
        judge_lose = 1,       /**< 裁判系统掉线（无数据接收） */
    } state;
    struct {
        float tick;     /**< 连续在线计时 */
        uint8_t yes;    /**< 在线标志 */
    } online;           /**< 在线状态记录 */
} judge_state_t;

/**
 * @brief 超级电容状态监控结构体
 */
typedef struct {
    enum { /* 超级电容状态枚举 */
        super_elec_ok = 0,    /**< 超电正常 */
        super_elec_lose,      /**< 超电掉线 */
    } state;
    struct {
        float tick;     /**< 连续在线计时 */
        uint8_t yes;    /**< 在线标志 */
    } online;           /**< 在线状态记录 */
} super_elec_state_t;

/************************************ 整体状态结构体（整合所有模块状态） ***********************************************/

/**
 * @brief 系统整体状态监控主结构体
 */
typedef struct {
    struct {
        struct {
#ifndef Chassis_Wheel_Type
	#error "Undefine 'Chassis_Wheel_Type'"  // 未定义底盘类型时报错
#endif
#if Chassis_Wheel_Type == Helf_Helm_Wheel  /**< 半舵轮底盘 */
            struct {
                gm6020_state_t helm;  /**< 前轮舵向电机（GM6020）状态 */
                c620_state_t wheel;   /**< 前轮轮向电机（C620）状态 */
            } f;
            struct {
                gm6020_state_t helm;  /**< 后轮舵向电机（GM6020）状态 */
                c620_state_t wheel;   /**< 后轮轮向电机（C620）状态 */
            } b;
            struct {
                c620_state_t wheel;   /**< 左轮轮向电机（C620）状态 */
            } l;
            struct {
                c620_state_t wheel;   /**< 右轮轮向电机（C620）状态 */
            } r;
#elif (Chassis_Wheel_Type == Omni_Wheel) ||   /**< 全向轮/麦克纳姆轮底盘 */\
		(Chassis_Wheel_Type == Mecanum_Wheel)
                c620_state_t lf;   /**< 左前轮轮向电机（C620）状态 */
				
                c620_state_t lb;   /**< 左后轮轮向电机（C620）状态 */
				
                c620_state_t rf;   /**< 右前轮轮向电机（C620）状态 */
				
                c620_state_t rb;   /**< 右后轮轮向电机（C620）状态 */
#elif Chassis_Wheel_Type == Leg_Wheel  /**< 腿轮混合底盘 */
            struct {
                c620_state_t knot;    /**< 左前关节电机（C620）状态 */
            } lf;
            struct {
                c620_state_t knot;    /**< 左后关节电机（C620）状态 */
            } lb;
            struct {
                c620_state_t knot;    /**< 右前关节电机（C620）状态 */
            } rl;
            struct {
                c620_state_t knot;    /**< 右后关节电机（C620）状态 */
            } rb;
            struct {
                c620_state_t wheel;   /**< 左轮毂电机（C620）状态 */
            } l;
            struct {
                c620_state_t wheel;   /**< 右轮毂电机（C620）状态 */
            } r;
#endif
        } motor;                /**< 底盘电机状态（根据轮型动态配置） */
        gyro_state_t gyro;      /**< 底盘陀螺仪状态 */
        super_elec_state_t super_elec;  /**< 底盘超级电容状态 */
        judge_state_t judge;    /**< 底盘裁判系统状态 */
    } chassis;                  /**< 底盘状态子结构体 */
    struct {
        struct {
            gyro_state_t dm_imu;  /**< 上板DM_IMU陀螺仪状态 */
            gyro_state_t hi2xx;   /**< 上板HI2XX传感器状态 */
        } gyro;                 /**< 上板陀螺仪状态子结构体 */
        vision_state_t vision;  /**< 上板视觉模块状态 */
        struct {
            rc_state_t dt7;     /**< DT7遥控器状态 */
            rc_state_t vt13;    /**< VT13遥控器状态 */
            rc_state_t judge;   /**< 裁判系统遥控器状态 */
        } rc;                   /**< 上板遥控器状态子结构体 */
        struct {
            struct {
                gm6020_state_t pitch;  /**< 云台pitch轴电机（GM6020）状态 */
                gm6020_state_t yaw;    /**< 云台yaw轴电机（GM6020）状态 */
            } gimbal;             /**< 云台电机状态子结构体 */
            struct {
                struct {
                    c620_state_t l;     /**< 左摩擦轮电机（C620）状态 */
                    c620_state_t r;     /**< 右摩擦轮电机（C620）状态 */
                } fire;               /**< 发弹机构摩擦轮状态子结构体 */
                c620_state_t knob;    /**< 拨盘电机（C620）状态 */
            } shoot;              /**< 发弹机构状态子结构体 */
        } motor;                /**< 上板电机状态子结构体 */
    } head;                     /**< 上板状态子结构体 */
    communicate_state_t communicate;  /**< 双板通信状态 */
    float sys_tick;             /**< 系统运行时间（秒，用于全局计时） */
} QWF_State_t;

extern QWF_State_t* qwf_state;  /**< 全局系统状态指针 */

/**
 * @brief 获取系统运行时间
 * @return float 系统运行时间（秒）
 */
#define get_qwf_sys_tick() (qwf_state->sys_tick)

#pragma pack(pop)  /**< 恢复默认对齐方式 */
#endif
